Перейти к основному содержимому

5.16. История языка

Разработчику Архитектору

История языка Cobol

История языка

1. Предыстория: контекст появления бизнес-ориентированных языков программирования

К концу 1950‑х годов вычислительная техника переживала переход от узкоспециализированных научных и военных приложений к широкому использованию в гражданских отраслях — прежде всего в банковской сфере, страховании, логистике, государственном управлении и бухгалтерском учёте. В отличие от научных расчётов (где преобладали численные методы, матричные операции и дифференциальные уравнения), задачи этих сфер имели иную природу: обработка больших объёмов структурированных записей (например, платёжных поручений, страховых полисов, налоговых деклараций), реализация строгих процедур проверки, валидации и агрегации, а также соблюдение нормативных требований и регулярное формирование отчётности.

На тот момент программирование осуществлялось преимущественно на ассемблере, а также с помощью ранних языков высокого уровня — FORTRAN (1957), разработанного IBM под научные вычисления, и FLOW-MATIC (1955–1959), созданного Грейс Хоппер и её командой в Remington Rand для UNIVAC I.

FORTRAN, несмотря на успех в научной среде, оказался плохо приспособлен к задачам обработки текстовых данных, операций над денежными величинами с фиксированной точкой и работе с иерархическими файловыми структурами (вроде последовательных записей с фиксированной длиной). Ассемблер, хотя и позволял добиться максимальной эффективности, требовал высокой квалификации, был трудночитаемым, не обеспечивал переносимости даже между моделями одного производителя и делал сопровождение программ исключительно дорогостоящим.

Именно в этом контексте возникла необходимость в языке, удовлетворяющем трём ключевым требованиям:

  • ориентация на бизнес-логику — возможность естественно описывать операции над записями, денежными суммами, датами, иерархическими структурами данных;
  • читаемость и близость к естественному языку — с учётом того, что программистами всё чаще становились не физики или математики, а специалисты по управлению, бухгалтеры, экономисты;
  • переносимость — возможность писать код, не зависящий от конкретной архитектуры ЭВМ.

Эти требования легли в основу спецификации нового языка, получившего название COBOLCOmmon Business-Oriented Language.


2. Инициатива CODASYL и рождение COBOL (1959)

В апреле 1959 года министерство обороны США, столкнувшееся с растущими затратами на разработку и сопровождение программного обеспечения для военных и гражданских ведомств, инициировало встречу с представителями промышленности, академических кругов и государственных учреждений. На этой встрече, прошедшей в Пентагоне, была сформирована рабочая группа под эгидой Conference on Data Systems Languages (CODASYL), призванная выработать стандарт описания данных и язык программирования, пригодный для широкого применения в бизнесе.

В состав CODASYL вошли представители шести ведущих компаний и организаций: IBM, RCA, Sylvania, Honeywell, Burroughs и Sperry Rand (владелец UNIVAC), а также Национального бюро стандартов (ныне NIST) и ВВС США. Грейс Хоппер, уже имевшая опыт создания FLOW-MATIC и активно продвигавшая идею английского языка как основы программирования, сыграла ключевую роль в формировании философии COBOL. Её принцип — «computer programs should be written in a language that is close to English» — лег в основу синтаксического и семантического дизайна.

К декабрю 1959 года CODASYL представил первую спецификацию, известную как COBOL-60. Хотя формально стандарт ещё не был утверждён, его черновик уже содержал принципиально новую структуру программы, включающую четыре обязательные секции:

  • IDENTIFICATION DIVISION — метаданные и идентификация программы;
  • ENVIRONMENT DIVISION — описание внешней среды (оборудования, файлов);
  • DATA DIVISION — декларация данных с детальной типизацией (включая PIC — picture clauses);
  • PROCEDURE DIVISION — собственно логика.

Особое внимание уделялось декларативному описанию данных. В отличие от FORTRAN, где переменные вводились в коде императивно и имели примитивные типы (INTEGER, REAL), COBOL допускал описание сложных иерархических структур — например, записи с вложенными полями, повторяющимися группами (OCCURS), явными ограничениями формата (PIC 9(5)V99 для денежных сумм с двумя знаками после запятой). Такое описание выносилось в отдельную секцию, где данные рассматривались как независимые от логики объекты, что соответствовало практикам бухгалтерского и управленческого учёта.

Синтаксис COBOL намеренно избегал математической символики в пользу словесных конструкций:
ADD A TO B GIVING C,
MOVE ZERO TO TOTAL-COUNT,
PERFORM CALCULATE-TAX UNTIL END-OF-FILE.

Это позволяло неспециалистам (например, аудиторам или руководителям проектов) читать программный код и проверять соответствие бизнес‑правилам без глубокого погружения в технические детали.

В мае 1960 года были проведены первые успешные компиляции COBOL-программ на машинах RCA 501 и UNIVAC II. К ноябрю того же года IBM, не участвовавшая изначально в разработке (её приоритетом оставался FORTRAN), объявила о поддержке COBOL на серии IBM 7000, что стало решающим импульсом для массового распространения языка.


3. Стандартизация и эволюция: от COBOL-60 до COBOL-85 и далее

Ранние реализации COBOL отличались несовместимостью. Производители вносили собственные расширения: IBM добавила операторы для работы с индексированными файлами, RCA — для пакетной обработки, Honeywell — для многозадачности. Эта фрагментация противоречила изначальной цели переносимости.

Первый официальный стандарт был принят Американским национальным институтом стандартов (ANSI) в 1968 году — ANS X3.23-1968, известный как COBOL-68. Он нормировал:

  • 48 зарезервированных слов (впоследствии расширено);
  • строгую иерархию дивизионов и параграфов;
  • правила описания файлов с тремя организациями: SEQUENTIAL, RELATIVE, INDEXED;
  • операторы управления потоком (IF, PERFORM, GO TO), но без поддержки структурного программирования в полной мере.

В 1974 году вышел пересмотренный стандарт — COBOL-74 (ANS X3.23-1974). Он ввёл:

  • динамическое управление памятью (CALL … USING BY REFERENCE/VALUE);
  • расширенные возможности работы с датами и временем;
  • поддержку локализации (альтернативные символы для разных национальных кодировок);
  • уточнения семантики OCCURS DEPENDING ON.

Однако наиболее значимым стал COBOL-85 (ANSI X3.23-1985), который кардинально модернизировал язык:

  • строгое структурное программирование: упразднение безусловного GO TO в пользу EVALUATE (аналог switch), CONTINUE, EXIT PERFORM;
  • вложенность параграфов и секций;
  • логические операторы AND, OR, NOT в условиях;
  • встроенное управление ошибками (ON SIZE ERROR, ON OVERFLOW);
  • поддержка вложенных программ (NESTED PROGRAMS);
  • расширенная типизация: COMP-1, COMP-2 (плавающая точка), COMP-3 (упакованный десятичный формат — critical для финансовых расчётов).

COBOL-85 стал де-факто базой для большинства промышленных систем, эксплуатируемых и по сей день.

Дальнейшие редакции — COBOL 2002 и COBOL 2014 (ISO/IEC 1989:2014) — добавили объектно-ориентированные возможности (CLASS, METHOD, INHERITANCE), поддержку Unicode, работу с XML, интеграцию с Java через JNI, а также модульность (PROGRAM-ID IS COMMON). Тем не менее, эти расширения получили крайне ограниченное распространение: большинство legacy-систем остались на COBOL-85, а новые проекты почти не запускались на COBOL после 1990‑х.


4. Причины долговечности: почему COBOL не исчез

Несмотря на появление десятков более выразительных, компактных и безопасных языков (C, C++, Java, C#, Python), COBOL сохранил значительную долю критически важных систем. Эту устойчивость нельзя объяснить исключительно «инерцией» или «неспособностью мигрировать». Существуют объективные техничко-экономические факторы:

4.1. Объём и стоимость кодовой базы

По оценкам Gartner, CISCO и консалтинговых фирм (например, Reuters, 2020), в мире эксплуатируется более 220 млрд строк COBOL-кода. Только в США федеральные ведомства используют около 43 млрд строк; крупнейшие банки — по 5–15 млрд строк каждая. Стоимость полной переписки такой системы на другой язык оценивается в сотни миллионов долларов, а срок — в 5–10 лет, с высоким риском потери функциональной эквивалентности (особенно для сложных бизнес-правил, накопленных за десятилетия).

4.2. Надёжность и предсказуемость

COBOL-программы, развёрнутые в 1970–1980‑х, работают в режиме 24/7 без перезагрузок годами. Архитектура таких систем (часто построенная на IBM z/OS, CICS, IMS, VSAM) обеспечивает:

  • транзакционную целостность на уровне mainframe;
  • строгую контрольную проверку формата данных на этапе компиляции (PICTURE-описания исключают неявные преобразования);
  • детерминированное поведение при переполнении (ON SIZE ERROR);
  • атомарность операций над записями.

Эти свойства критичны для платёжных систем, где ошибка на один цент в миллиарде транзакций приводит к регуляторным санкциям.

4.3. Интеграционная совместимость

Современные mainframe-платформы позволяют вызывать COBOL-подпрограммы из Java (через CICS Program Link), из REST API (через z/OS Connect), из облачных микросервисов (через IBM Z Open Unit Test и Zowe). Это позволяет инкапсулировать COBOL-ядро как «черный ящик» внутри современного стека, не затрагивая его логику.

4.4. Нормативные и регуляторные ограничения

Многие финансовые стандарты (например, SWIFT MT/MX, ISO 20022) и банковские регламенты (Basel III, SOX) ссылаются на конкретные алгоритмы расчёта, реализованные в COBOL-коде. Любое изменение требует не только технической верификации, но и одобрения аудиторов, центральных банков и органов надзора — процесс, который может занять годы.


5. Современное состояние и перспективы

По состоянию на 2025 год COBOL остаётся языком, критически важным, но не развивающимся. Производители mainframe (IBM, Fujitsu, Micro Focus) продолжают поставлять компиляторы, отладчики и инструменты интеграции. Micro Focus Visual COBOL, например, поддерживает разработку в Visual Studio и Eclipse, компиляцию под Windows, Linux и .NET, а также генерацию Docker-образов.

Однако наблюдается острый дефицит кадров: по данным Dice и IEEE Spectrum, средний возраст COBOL-разработчика в США — 58 лет; менее 0,1 % выпускников университетов изучают COBOL в рамках основной программы. В 2020 году, в разгар пандемии, штат Нью-Джерси призвал на помощь ветеранов-программистов, чтобы модернизировать систему выплат по безработице, написанную на COBOL в 1970‑х, — ситуация, ставшая символом системного риска.

В ответ на это появились инициативы:

  • OpenCOBOLGnuCOBOL (свободная реализация, совместимая с COBOL-85, поддержка Unicode и C-библиотек);
  • COBOL as a Service — платформы вроде COBOL-Cloud от TmaxSoft, позволяющие запускать legacy-код на VM без mainframe;
  • академические курсы (например, в Университете штата Мэриленд, Токийском институте технологий) по «поддержке критических legacy-систем».

Тем не менее, стратегия большинства организаций — не миграция, а эволюционное сопровождение: рефакторинг в рамках COBOL-85, покрытие тестами (с помощью Z Open Unit Test), постепенное вынесение небизнес-логики (UI, routing, logging) в внешние слои, а также автоматическая документация через статический анализ.